package projectisd.client;

import java.util.List;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.HTMLTable.Cell;

/**
 * Dit is de Entry point class deze class zal als eerste opstarten zodra
 * het programma opstart. 
 */
public class Projectisd implements EntryPoint {
    private MenuGUI menuGui;

    private VakGUI vakGui;
    private VakDelegate vakDelegate;
    private LeerlingGUI leerlingGui;
    private LeerlingDelegate leerlingDelegate;
    private KlasGUI klasGui;
    private KlasDelegate klasDelegate;
    private LeraarGUI leraarGui;
    private LeraarDelegate leraarDelegate;
    private LesGUI lesGui;
    private LesDelegate lesDelegate;
    private InschrijvenVakGUI inschrijvenVakGui;
    private InschrijvenVakDelegate inschrijvenVakDelegate;
    private AfmeldenGUI afmeldenGui;
    private AfmeldenDelegate afmeldenDelegate;
    
    /**
     * Hier worden alle GUI klassen
     * aangemaakt in de onloadmodule methode.
     */
    public void onModuleLoad() {

    	menuGui = new MenuGUI();
    	menuGui.init();
    	wireMenuGUIEvents();

    	// vakGui aanmaken
    	vakGui = new VakGUI();
    	vakDelegate = new VakDelegate();
    	vakGui.vakService = vakDelegate;
    	vakDelegate.gui = vakGui;
        vakGui.init();
        vakGui.hideGui();
        wireVakToevoegenGUIEvents();
        
        // leerlingGui aanmaken
    	leerlingGui = new LeerlingGUI();
    	leerlingDelegate = new LeerlingDelegate();
    	leerlingGui.leerlingService = leerlingDelegate;
    	leerlingDelegate.gui = leerlingGui;
    	leerlingGui.init();
    	leerlingGui.hideGui();
        wireLeerlingToevoegenGUIEvents();
        
        //klasGui aanmaken
        klasGui = new KlasGUI();
       	klasDelegate = new KlasDelegate();
    	klasGui.klasService = klasDelegate;
    	klasDelegate.gui = klasGui;
    	klasGui.init();
    	klasGui.hideGui();
        wireKlasToevoegenGUIEvents();
        
      //leraarGui aanmaken
        leraarGui = new LeraarGUI();
        leraarDelegate = new LeraarDelegate();
        leraarGui.leraarService = leraarDelegate;
        leraarDelegate.gui = leraarGui;
        leraarGui.init();
        leraarGui.hideGui();
        wireLeraarToevoegenGUIEvents();
        
      //lesGui aanmaken
        lesGui = new LesGUI();
        lesDelegate = new LesDelegate();
        lesGui.lesService = lesDelegate;
        lesDelegate.gui = lesGui;
        lesGui.init();
        lesGui.hideGui();
        wireLesToevoegenGUIEvents();
        
      //inschrijvenVakGui aanmaken
        inschrijvenVakGui = new InschrijvenVakGUI();
        inschrijvenVakDelegate = new InschrijvenVakDelegate();
        inschrijvenVakGui.inschrijvenVakService = inschrijvenVakDelegate;
        inschrijvenVakDelegate.gui = inschrijvenVakGui;
        inschrijvenVakGui.init();
        inschrijvenVakGui.hideGui();
        wireInschrijvenVakToevoegenGUIEvents();
        
      //afmeldenGui aanmaken
        afmeldenGui = new AfmeldenGUI();
        afmeldenDelegate = new AfmeldenDelegate();
        afmeldenGui.afmeldenService = afmeldenDelegate;
        afmeldenDelegate.gui = afmeldenGui;
        afmeldenGui.init();
        afmeldenGui.hideGui();
        wireAfmeldenToevoegenGUIEvents();
    }
    
    /** 
     * Maakt een methode die kan worden gebruikt om de GUIS te hiden
     *@hideAllGui
     */

    private void hideAllGui() {
    	vakGui.hideGui();
    	leerlingGui.hideGui();
    	klasGui.hideGui();
    	leraarGui.hideGui();
    	lesGui.hideGui();
    	inschrijvenVakGui.hideGui();
    	afmeldenGui.hideGui();
    }
    
    /** 
     * Maakt een methode die kan worden gebruikt om de het menu
     * werkend te krijgen zodat er op de knoppen gedrukt kan worden en
     * dat ze het juiste formulier openen
     *@wireMenuGUIEvents
     */

    
    private void wireMenuGUIEvents() {
    	menuGui.vakButton.addClickHandler(new ClickHandler(){
            public void onClick(ClickEvent event) {
            	hideAllGui();
            	vakDelegate.listVakken();
            	// menuGui.gui_eventButtonClicked();
            }});
    	menuGui.leerlingButton.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				hideAllGui();
				leerlingDelegate.listLeerlingen();
				
			
			}});
    	menuGui.klasButton.addClickHandler(new ClickHandler() {
    		public void onClick(ClickEvent event) {
    			hideAllGui();
    			klasDelegate.listKlassen();
    		
    		}});
    	menuGui.leraarButton.addClickHandler(new ClickHandler() {
    		public void onClick(ClickEvent event) {
    			hideAllGui();
    			leraarDelegate.listLeraren();
    		
    		}});
    	menuGui.lesButton.addClickHandler(new ClickHandler() {
    		public void onClick(ClickEvent event) {
    			hideAllGui();
    			lesDelegate.listLessen();
    		
    		}});
    	menuGui.inschrijvenVakButton.addClickHandler(new ClickHandler() {
    		public void onClick(ClickEvent event) {
    			hideAllGui();
    			inschrijvenVakDelegate.listInschrijvenVakken();
    		
    		}});
    	menuGui.afmeldenButton.addClickHandler(new ClickHandler() {
    		public void onClick(ClickEvent event) {
    			hideAllGui();
    			afmeldenDelegate.listAfmeldingen();
    		
    		}});
 
    }
    
    /** 
     * Maakt een methode die er voor zorgt dat
     * de List de add de update en de addnewButton in Vak kunnen
     * worden uitgevoerd met een ClickHandler
     *@wireVakToevoegenGUIEvents
     */
    
    private void wireVakToevoegenGUIEvents() {
    	vakGui.listGrid.addClickHandler(new ClickHandler(){
            public void onClick(ClickEvent event) {
                 Cell cellForEvent = vakGui.listGrid.getCellForEvent(event);
                 vakGui.gui_eventListGridClicked(cellForEvent);                
            }});
        
    	vakGui.addButton.addClickHandler(new ClickHandler(){
            public void onClick(ClickEvent event) {
            	vakGui.gui_eventAddButtonClicked();
            }});

    	vakGui.updateButton.addClickHandler(new ClickHandler(){
            public void onClick(ClickEvent event) {
            	vakGui.gui_eventUpdateButtonClicked();
            }});
        
    	vakGui.addNewButton.addClickHandler(new ClickHandler(){
            public void onClick(ClickEvent event) {
            	vakGui.gui_eventAddNewButtonClicked();
           }});
    	}
    
    /** 
     * Maakt een methode die er voor zorgt dat
     * de List de add de update en de addnewButton in Leerling kunnen
     * worden uitgevoerd met een ClickHandler
     *@wireLeerlingToevoegenGUIEvents
     */
    
        private void wireLeerlingToevoegenGUIEvents() {
        	leerlingGui.listGrid.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                     Cell cellForEvent = leerlingGui.listGrid.getCellForEvent(event);
                     leerlingGui.gui_eventListGridClicked(cellForEvent);                
                }});
        	
        	leerlingGui.addButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	leerlingGui.gui_eventAddButtonClicked();
                }});

        	leerlingGui.updateButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	leerlingGui.gui_eventUpdateButtonClicked();
                }});
            
        	leerlingGui.addNewButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	leerlingGui.gui_eventAddNewButtonClicked();
               }});
        }
        
        /** 
         * Maakt een methode die er voor zorgt dat
         * de List de add de update en de addnewButton in Klas kunnen
         * worden uitgevoerd met een ClickHandler
         *@wireKlasToevoegenGUIEvents
         */
        
        private void wireKlasToevoegenGUIEvents() {
        	klasGui.listGrid.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                     Cell cellForEvent = klasGui.listGrid.getCellForEvent(event);
                     klasGui.gui_eventListGridClicked(cellForEvent);                
                }});
        	
        	klasGui.addButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	klasGui.gui_eventAddButtonClicked();
                }});

        	klasGui.updateButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	klasGui.gui_eventUpdateButtonClicked();
                }});
            
        	klasGui.addNewButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	klasGui.gui_eventAddNewButtonClicked();
               }});
        }    
        
        /** 
         * Maakt een methode die er voor zorgt dat
         * de List de add de update en de addnewButton in Leraar kunnen
         * worden uitgevoerd met een ClickHandler
         *@wireLeraarToevoegenGUIEvents
         */
        
        private void wireLeraarToevoegenGUIEvents() {
        	leraarGui.listGrid.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                     Cell cellForEvent = leraarGui.listGrid.getCellForEvent(event);
                     leraarGui.gui_eventListGridClicked(cellForEvent);                
                }});
        	
        	leraarGui.addButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	leraarGui.gui_eventAddButtonClicked();
                }});

        	leraarGui.updateButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	leraarGui.gui_eventUpdateButtonClicked();
                }});
            
        	leraarGui.addNewButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	leraarGui.gui_eventAddNewButtonClicked();
               }});
        }
        
        /** 
         * Maakt een methode die er voor zorgt dat
         * de List de add de update en de addnewButton in Les kunnen
         * worden uitgevoerd met een ClickHandler
         *@wireLesToevoegenGUIEvents
         */
        
        private void wireLesToevoegenGUIEvents() {
        	lesGui.listGrid.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                     Cell cellForEvent = lesGui.listGrid.getCellForEvent(event);
                     lesGui.gui_eventListGridClicked(cellForEvent);                
                }});
        	
        	lesGui.addButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	lesGui.gui_eventAddButtonClicked();
                }});

        	lesGui.updateButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	lesGui.gui_eventUpdateButtonClicked();
                }});
            
        	lesGui.addNewButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	lesGui.gui_eventAddNewButtonClicked();
               }});
        }
        
        /** 
         * Maakt een methode die er voor zorgt dat
         * de List de add de update en de addnewButton in Inschrijven Vak kunnen
         * worden uitgevoerd met een ClickHandler
         *@wireInschrijvenVakToevoegenGUIEvents
         */
        
        private void wireInschrijvenVakToevoegenGUIEvents() {
        	inschrijvenVakGui.listGrid.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                     Cell cellForEvent = inschrijvenVakGui.listGrid.getCellForEvent(event);
                     inschrijvenVakGui.gui_eventListGridClicked(cellForEvent);                
                }});
        	
        	inschrijvenVakGui.addButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	inschrijvenVakGui.gui_eventAddButtonClicked();
                }});

        	inschrijvenVakGui.updateButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	inschrijvenVakGui.gui_eventUpdateButtonClicked();
                }});
            
        	inschrijvenVakGui.addNewButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	inschrijvenVakGui.gui_eventAddNewButtonClicked();
               }});
        }
        
        /** 
         * Maakt een methode die er voor zorgt dat
         * de List de add de update en de addnewButton in Afmelden kunnen
         * worden uitgevoerd met een ClickHandler
         *@wireAfmeldenToevoegenGUIEvents
         */
        
        private void wireAfmeldenToevoegenGUIEvents() {
        	afmeldenGui.listGrid.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                     Cell cellForEvent = afmeldenGui.listGrid.getCellForEvent(event);
                     afmeldenGui.gui_eventListGridClicked(cellForEvent);                
                }});
        	
        	afmeldenGui.addButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	afmeldenGui.gui_eventAddButtonClicked();
                }});

        	afmeldenGui.updateButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	afmeldenGui.gui_eventUpdateButtonClicked();
                }});
            
        	afmeldenGui.addNewButton.addClickHandler(new ClickHandler(){
                public void onClick(ClickEvent event) {
                	afmeldenGui.gui_eventAddNewButtonClicked();
               }});
        }
}

